package aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.JoinPoint;
import java.util.Arrays;

public class MyAspect {
    public void a(){
        System.out.println("aaaaa");
    }

    //前置通知
    public void before() {
        System.out.println("前置通知");
    }

    //后置通知
    public void after() {
        System.out.println("后置通知");
    }

    //环绕通知
    //需要我们确定方法的执行 所以在环绕通知中需要我们自己进行原方法的调用
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();//获取请求参数
        System.out.println("环绕通知"+ Arrays.toString(args));
        Object proceed = joinPoint.proceed(args);//调用源方法
        System.out.println("环绕通知"+proceed);
        // ProceedingJoinPoint 环绕通知中使用的获取原方法的参数
        //getArgs()获取原方法请求执行时传入的参数
        //proceed(args)调用执行原方法传入参数
        return proceed;
    }
    //异常通知
    //仅当对应的方法运行时出现异常 才会执行的通知
    //需要书写参数传入异常对象
    public void afterThrowing(Exception e1) {
        System.out.println("异常通知"+e1);
    }
    //返回通知
    //顾名思义就是在方法正常执行返回数据之后执行
    //一旦出现异常该通知就不会执行
    public void returning(JoinPoint joinPoint, Object res) throws Throwable {
        System.out.println("返回通知");
        System.out.println(Arrays.toString(joinPoint.getArgs()));
        System.out.println(res);
    }

}